package com.wy.util.security;

import java.util.Set;

import com.wy.entity.User;


/**
 * 权限判断算法:<br/>
 *  	1.每个权限用一个唯一的整数表示<br/>
 * 		2.传入用户拥有的权限集合(userPurviewSet)以及当前权限(optPurview)<br/>
 * 		3.判断该用户是否含有当前的权限
 * @author WY
 * Ps:不能判断超过30的权限
 */
public final class PurviewJudgementArithmetic {

//	private Integer add_a = 0;
//	private Integer upd_a = 1;
//	private Integer del_a = 2;
//	
//	private Integer add_b = 3;
//	private Integer upd_b = 4;
//	private Integer del_b = 5;
//	private Integer userPurview = pow(2) + pow(3) + pow(4) + pow(5);

	/**
	 * 用户权限验证
	 * @param user
	 * @return boolean
	 */
	public static boolean doAuthorityValidate(User user){
		//权限验证代码.....
		
		return true;
	}
	
	/**
	 * 权限判断
	 * @param userPurviewSet 用户所有权限集合    
	 * @param optPurview  要判断的权限
	 * @return boolean 
	 */
	public static boolean purviewJudgement(Set<Integer> userPurviewSet, Integer optPurview){
		//生成用户权限总值
		Integer userPurview = generateUserPurviewBySet(userPurviewSet);
		//权限判断
		Integer value = userPurview & pow(optPurview);
		Integer rsNum = log(2, value);		
		if(rsNum == optPurview){
			return true;
		}
		return false;
	}
	
	/**
	 * 幂运算
	 * @param num 传入参数
	 * @return 2的num次幂
	 */
	private static Integer pow(Integer num){
		return (int) Math.pow(2, num);
	}
	
	/**
	 * log计算
	 * @param base 底数
	 * @param num 真数
	 * @return 以base为底num的对数
	 */
	private static Integer log(Integer base,Integer num){
		return (int) (Math.log(num)/Math.log(base));
	}

	/**
	 * 生成用户权限总值
	 * @param userPurviewSet 用户权限值集合;
	 * 						      生成策略-->所有权限值的幂值相加；如：Math.pow(2,purviewNum1) + Math.pow(2,purviewNum2) +... 
	 * @return 权限总值，用于权限判断
	 */
	private static Integer generateUserPurviewBySet(Set<Integer> userPurviewSet){
		Integer userPurview = 0;
		for(Integer purviewNum : userPurviewSet){
			userPurview += pow(purviewNum);
		}
		return userPurview;
	}
	
	
	/**
	 * @param args
	 */
//	public static void main(String[] args) {
//		
//		PurviewJudgementArithmetic test = new PurviewJudgementArithmetic();
//
//		Integer optPurview = 20;
//		Integer userPurview = 0;
//		for(int i=0;i<20;i++){
//			userPurview += test.pow(i);
//		}
//		
//		boolean result = test.purviewJudgement(userPurview,optPurview);
//		if(result){
//			System.out.println("验证通过，允许访问！");
//		}else{
//			System.out.println("您无权访问！");
//		}
//	}
}
